package com.cskaoyan.javase.oop2._1extends._5protected._2example;

/**
 * Java所有类都直接或间接地继承了Object，也会同时继承它当中的一个protected修饰的成员方法clone()
 * Object类是属于包java.lang,当中存在一个受保护的成员:clone()方法
 * Java中所有类都是Object类的子类,都会继承该方法
 *
 *
 * @since 11:31
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Student s = new Student();
        // 这里能不能调用clone方法?
        /*
            这里不是子类中创建子类自身对象
            而是在子类中,创建"兄弟姐妹"类对象
            是无法访问它继承自父类的受保护成员的
         */
        // 'clone()' has protected access in 'java.lang.Object'
        // s.clone();

        // 这里能够调用谁的克隆方法?
        Demo d = new Demo();
        // Unhandled exception: java.lang.CloneNotSupportedException
        d.clone();

        // 这里能不能克隆Teacher?
        /*
            可以访问,因为同包下任意访问
         */
        Teacher t = new Teacher();
        t.clone();
    }
}

class Student {
    public static void test() throws CloneNotSupportedException {
        Student s = new Student();
        // Unhandled exception: java.lang.CloneNotSupportedException
        s.clone();
    }
}

class Teacher {
    // 方法的重写
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}